\documentclass{article}
\usepackage{geometry}
\geometry{margin=1.5cm, vmargin={0pt,1cm}}
\setlength{\topmargin}{-1cm}
\setlength{\paperheight}{29.7cm}
\setlength{\textheight}{25.3cm}

% useful packages.
\usepackage{amsfonts}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{amsthm}
\usepackage{enumerate}
\usepackage{graphicx}
\usepackage{subfigure}
\usepackage{multicol}
\usepackage{fancyhdr}
\usepackage{layout}
\usepackage{ctex}
\usepackage{listings}

% some common command
\newcommand{\dif}{\mathrm{d}}
\newcommand{\avg}[1]{\left\langle #1 \right\rangle}
\newcommand{\difFrac}[2]{\frac{\dif #1}{\dif #2}}
\newcommand{\pdfFrac}[2]{\frac{\partial #1}{\partial #2}}
\newcommand{\OFL}{\mathrm{OFL}}
\newcommand{\UFL}{\mathrm{UFL}}
\newcommand{\fl}{\mathrm{fl}}
\newcommand{\op}{\odot}
\newcommand{\Eabs}{E_{\mathrm{abs}}}
\newcommand{\Erel}{E_{\mathrm{rel}}}

\usepackage{xcolor}
\usepackage{fontspec} 
\definecolor{dkgreen}{rgb}{0,0.6,0}
\definecolor{gray}{rgb}{0.5,0.5,0.5}
\definecolor{comment}{rgb}{0.56,0.64,0.68}


\begin{document}
\title{Project \#1}
\pagestyle{fancy}
\lhead{Name Li HuiTeng 3180102114}
\chead{ numPDE}
\rhead{Date 21.04.29}

\section*{1. 实验目的}
差分法是一种解决微分方程初边值问题的数值方法，其中线性多步方法(LMM)与荣格方法(RK)是常用的经典方法。本次实验选取了各种精确度,步数的线性多步方法，与经典四阶荣格方法，
来对一个定义良好的具体初值问题进行求解;通过比较它们的收敛性态，来加深对差分法的理解，并锻炼编程能力。

\section*{2. 实验完成情况}
本次实验在C++环境下实现，编写的代码用于对给定的一个六维的初值问题以用户要求的13种方法进行数值求解与分析。纯虚基类
$class TimeIntegrator$下定义了派生类class AB, class AM, class BDF, class ERK4. 

在设计中，用户最常用的是基类成员函数

$void\quad create\_as\_uwish(Eigen::VectorXd,string,double)$。 

它作用在每个派生类成员上，接收初始值向量，含具体精度的方法字符串，与时间长度;在运行后会生成一个名为output-(name).m的文件以用于绘图。这里的时间步长dt是预先
设定好并存放在名为lmm-scheme的外部文件中的。（如有需要，也可以在lmm-scheme中按格式添加更高精度步长的同名LMM方法。）

当然，令人不愉快的是，我在这次实验共有两个未完成的作业格式要求：
\begin{itemize}
	\item[1.]未能使用$Factory.h$来对$TimeIntegrator.h$来进行管理,导致无法动态创建派生类对象。
	\item[2.]未能使用$Cmake$来对整个文件库进行管理,导致文件夹的熵值始终处在一个很高的水平。
\end{itemize}
这两个问题我会尽力在下一次大作业中解决。

\section*{3. 实验结果展示}
通过文件夹dot-cpp中的Makefile文件,我们可以在终端输入 make run在终端输出两个初始条件下不同方法的列表，这就对讲义中的要求（b）进行了回答。

同时，输入make write，可以重定向输出到一个名为answer-require-b.txt的文件，输入 make clean 可以一键清除计算过程中产生的.o和.m后缀的垃圾。另外如果不想运行
这个文件，那么下面记录了该列表的内容：
\begin{lstlisting}
	#INITIAL CONDITION (2)
	#name:AB
		  order   steps   Error   Re_Error  CPU_Time
		   1    24000  1.88911  1.90051 0.312625
		   2    24000 0.610672 0.614358 0.367444
		   3    24000  0.29474  0.29652 0.429699
		   4    24000 0.272952 0.274599 0.490943
	#name:AM
		  order   steps   Error   Re_Error  CPU_Time
			2     24000  0.298728  0.300531   3.93336
			3     24000  0.240909  0.242364    3.8167
			4     24000 0.0802501 0.0807345   3.92005
			5     24000 0.0633196 0.0637018   4.06578
	#name:BDF
		  order   steps   Error   Re_Error  CPU_Time
			 1      24000    54.1798    54.5068    4.12527
			 2      24000   0.693986   0.698175    3.88285
			 3      24000  0.0761106    0.07657    3.66461
			 4      24000 0.00886158 0.00891507    3.95923
	#name:ERK
		  order   steps   Error   Re_Error  CPU_Time
			 4      24000 0.00258874 0.00260437   0.556403
	
	#INITIAL CONDITION (3)
	#name:AB
		  order   steps   Error_Approxi   Converg_Rate  CPU_Time
			  1       20000    0.231369     1.14153    0.304281
			  2       20000 7.83035e-05     1.70589    0.366375
			  3        6000 0.000229208     2.98025    0.109114
			  4        1000   0.0022028     3.99937    0.020649
	#name:AM
		  order   steps   Error_Approxi   Converg_Rate  CPU_Time
			  2       20000  0.00199348      2.1748    0.232159
			  3       20000  0.00690941     3.41272     0.20246
			  4        1000 6.30637e-05     3.94767    0.293182
			  5        1000 0.000165102     4.73766    0.257339
	#name:BDF
		  order   steps   Error_Approxi   Converg_Rate  CPU_Time
			 1      30000   0.136283    2.41661    4.66744
			 2       2000 0.00308771    2.79505   0.372597
			 3        600  0.0197015    2.44568   0.106773
			 4        600  0.0228479    1.70908   0.148667
	#name:ERK
		  order   steps   Error   Converg_Rate  CPU_Time
			  4        1000 1.15908e-05     5.18186    0.021591
	
	Complete!	
\end{lstlisting}
这个列表使用的均是max范数。对于初值问题（2），由于周期解可以轻松地验证终解误差，所以我采用了相同的步长dt, 
为的是可以直观的看出各种方法的性态。对于初值问题（3），我们用二阶的Richardson外插值法对终解进行一个估计，并
依赖这个估计给出近似的终解误差。同时，顺便计算了一下收敛速率。

从理论上， 我们知道在给定步长与初值问题条件的前提下，对不同算法，有两个因素如果过弱，会对终解误差做出贡献。一个是算法的精确度太低，
另一个是在每个时刻将问题（在充分小的时间区间中）线性化以后，算法的绝对稳定性条件不能被很好地满足，甚至被违背了。第一个因素是明显确定的，
但第二个因素数学化不太方便。虽然定量计算不现实，但可以从方法是隐格式还是显格式来定性判断，一般来说隐格式的绝对稳定性是大大强于显格式的。

从结果上看，对于这个问题来说，在p小于等于5的时候，这两个的加强都能有效削减终解误差。但就CPU耗时来说，无疑采用更高的精确度比改用
隐格式方法是更有晓的。

另外，我们不妨观察一下初值问题（2）的条件下荣格法与欧拉法的图像：
\begin{figure}[]
	\centering
	\includegraphics[width=16cm,height=10cm]{2-ERK4}
	\caption{ERK4,N=6000 .}
\end{figure}


\begin{figure}[]
	\centering
	\includegraphics[width=16cm,height=10cm]{2-AB1}
	\caption{AB1,N=24000 .}
\end{figure}

\newpage
可以看到，对于初值问题（2）的条件下，这个问题有明显的stiffness性质。由于斜率在点与点间可能会存在
显著变化，所以在对于每一个迭代小步的理应要有更谨慎的处理。所以我们的荣格方法处理它是很适合的，6千步
就可以获得一个比较直观的趋势估计图。而处理
stiff problem，我们的LMM就会很乏力了。即便我们取欧拉法的步数为24000步，得到的图像仍然是会令人困惑的。

所以，关于讲义上的in addtion问题的答案是很明显的。在兼具终解误差小且CPU时间也小的情况下，自然是我们的经典
四阶显式荣格法是这场stiff problem性能大战的赢家。

另外，关于问题（c）的回答，其实除荣格法外均内蕴在了dot-cpp文件夹中的文件lmm-scheme的recommend-dt中，故这里不加赘述。
荣格法的recommend-dt是0.0017.
\end{document}

%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
